// 2014-02-01 Tyrghen
//---------------------------------------------
// Usage:
//  ["myVarName",1234] call edt_fnc_setVar;
//  ["myVarName",true] call edt_fnc_setVar;
//  ["myVarName",object] call edt_fnc_setVar;
//---------------------------------------------
// Purpose:
// Set a variable which will be shared between all clients and synchronised for JIP Players.
// Usually you will use it to store useful data for your mission which has impact on what users see. For example, the completion of objectives or that kind of things.
// 
// A typical case would be that you have a Trigger somewhere on your mission and when it gots activated, it will set a value.
// For example:
//    - Your trigger detects that Blufor have entered the zone
//    - The activation will call the following code: ["Blufor_In_Zone",true] edt_fnc_setVar;
//    - Then inside of one of your scripts, you will check that it happened like:
//			waituntil { ["Blufor_In_Zone",false] edt_fnc_getVar };
//			if (["Blufor_In_Zone",false] edt_fnc_getVar) then { ... };
// Using this method makes sure that when a user joins during the game, your script will run fine, even if at that time,
// there's no Blufor units in that zone anymore.
//
// Creating a trigger with an activation code like: BLUFOR_IN_ZONE = true; won't do the trick, because triggers are instancied locally and
// when the player will logs in, there's noone in the zone and the trigger won't activate on his computer, breaking the scripts depending on it.
// 
// Parameters:
// - A string containing the name of the variable, it's more the key of a dictionary.
// - A value of any type you will want to reference with your key
//
// Returns:
// Nothing
//---------------------------------------------
// Objectif:
// Crée une variable qui est partagée entre tous les clients et qui est synchronisée pour les joueurs qui se connectent pendant la partie.
// Généralement vous l'utiliserez pour stocker des données qui sont importantes pour la mission et qui ont un impact sur ce que le joueur voit. Par exemple, le statut d'un objectif à accomplir.
//
// Un exemple typique serait d'avoir un déclencheur (trigger) quelquepart sur la mission et quand il est activé, il assigne une valeur.
// Par exemple:
//    - Le déclencheur détecte que des Blufor entrent dans une zone
//    - L'activation va appeler le code suivant: ["Blufor_Dans_Zone",true] edt_fnc_setVar;
//    - Ensuite, dans un de vos scripts vous vérifiez que cet évènement s'est produit:
//			waituntil { ["Blufor_Dans_Zone",false] edt_fnc_getVar };
//			if (["Blufor_Dans_Zone",false] edt_fnc_getVar) then { };
// En utilisant cette méthode, vous êtes certain que lorsqu'un joueur se connecte en cours de partie, votre script va tourner comme il faut,
// même si au moment de la connexion il n'y a plus personne dans la zone du trigger.
//
// Créer un déclencheur avec un code d'activation comme: BLUFOR_DANS_ZONE = true; ne fonctionnera pas, parce que les déclencheurs sont instanciés localement
// et quand le joueur se connecte, il n'y a personne dans la zone, le déclencheur ne s'activera pas sur son PC.. et vos scripts seront foutus.
//
// Paramètres:
// - Une chaîne de caractères contenant le nom de la variable. En fait c'est plus la clé d'un dictionnaire de valeurs.
// - La valeur, peu importe le type, que vous voulez référencer avec cette clé.
//
// Renvoie:
// Rien
//---------------------------------------------

//#define __FORCE_TRACE__
//#define __FORCE_DEBUG__
//#define __FORCE_INFO__
#define THIS_FILE "editor\fn_setVar.sqf"
#include <tmf_constants.h>
#include <tmf_macros.h>

TRACE_1("Start",_this);
TMFPROFILERSTART;

private ["_key","_value","_value"];
DEFAULT_PARAM(_key,0,"");
DEFAULT_PARAM(_value,1,nil);
if (!(IS_STRING(_key))) then {
	if (IS_SCALAR(_key)) then {
		_key = format[TMF_EDITOR_OBJECTIVE,_key];
	} else {
		_key = str(_key);
	};
};
if (_key != "") then {
	//[TMF_SERVER_INSTANCE_ID,_key,_value] call FFUNC(setMissionVar);
	[QGVAR(jip_var), [TMF_SERVER_INSTANCE_ID,_key,_value],THIS_FILE] call FFUNC(callEvent);
	[QGVAR(all_var), [TMF_SERVER_INSTANCE_ID,_key,_value],THIS_FILE] call FFUNC(callEvent);
	TRACE_1("Updated",ARR_3(TMF_SERVER_INSTANCE_ID,_key,_value));
};
TRACE("End");
TMFPROFILERSTOP;